package entities;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.sql.SQLException;
import java.util.List;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import bd.ConexBD;
import clases.Empleado;
import clases.FondoMenu;

import java.io.*;


//
/**
 * Ventana encargada de gestionar la lista de empleados y mostrar el panel de atributos de los empleados
 */
public class VentanaGestionEmpleados extends JFrame implements ActionListener, ListSelectionListener, MouseListener{
	
	Ventana vNemp;
	Empleado miSistemaDeEmpleados;

	private JPanel fondo;
	private JPanel panelSuperior;
	private JPanel panelCentral;
	private JPanel panelIzquierdo;
	private JPanel panelBotonera;
	
	private JList lnombres;
	JScrollPane scrollListaNombre;
	
	private JButton bNuevoEmp;
	private JButton bModificar;	
	private JButton bBaja;
	private JButton btnBorrarEmpleado;
	private JButton bMenu;
	private JButton btnGestionHoras;
	public VentanaGestionEmpleados(Ventana ven){
		
		vNemp = ven;
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		FondoMenu fondo=new FondoMenu(); // cambio de imagen a la ventana
		getContentPane().add(fondo, BorderLayout.CENTER);
		this.setVisible(true);
		this.setBounds(Toolkit.getDefaultToolkit().getScreenSize().width/2-800/2,Toolkit.getDefaultToolkit().getScreenSize().height/2-600/2, 800, 600);

		
		panelSuperior=  new JPanel();
		panelSuperior.setBackground(Color.WHITE);
		panelSuperior.setVisible(true);
		panelSuperior.setOpaque(false);
		
		panelCentral=  new JPanel();
		panelCentral.setBackground(Color.WHITE);
		panelCentral.setVisible(true);
		panelCentral.setOpaque(false);
		
		panelIzquierdo=  new JPanel();
		panelIzquierdo.setBackground(Color.WHITE);
		panelIzquierdo.setVisible(true);
		panelIzquierdo.setOpaque(false);
		
		panelBotonera=  new JPanel();
		panelBotonera.setBackground(Color.WHITE);
		panelBotonera.setVisible(true);
		panelBotonera.setOpaque(false);
		
		bNuevoEmp= new JButton();
		bNuevoEmp.setText("Nuevo Empleado");
		bNuevoEmp.addActionListener(this);
		
		bModificar= new JButton();
		bModificar.setText("Modificar Datos");
		bModificar.addActionListener(this);
		
		btnBorrarEmpleado = new JButton("Borrar empleado");
		panelBotonera.add(btnBorrarEmpleado);
		btnBorrarEmpleado.addActionListener(this);
		
		bBaja= new JButton();
		bBaja.setText("Dar De Baja");
		bBaja.addActionListener(this);
		
		bMenu= new JButton();
		bMenu.setText("Inicio");
		bMenu.addActionListener(this);
		
		btnGestionHoras = new JButton("Gestion de horas");
        btnGestionHoras.addActionListener(this);
		
		fondo.setLayout(new BorderLayout());
		fondo.add("North",panelSuperior);
		fondo.add("Center",panelCentral);
		panelCentral.setLayout(null);
		
		fondo.add("West",panelIzquierdo);
		
		panelSuperior.add(panelBotonera);
		
		panelBotonera.add(bNuevoEmp);
		panelBotonera.add(bModificar);
		panelBotonera.add(bBaja);
		panelBotonera.add(bMenu);
		panelBotonera.add(btnGestionHoras);
		
		
		lnombres= new JList(); 
			
		cargarLista();
		
		scrollListaNombre = new JScrollPane( lnombres, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
		panelIzquierdo.setLayout(new BorderLayout());
		panelIzquierdo.setOpaque(false);
		panelIzquierdo.add( scrollListaNombre, "Center" );
		lnombres.addListSelectionListener(this);
		lnombres.addMouseListener(this);
		
	}
	
	
	
	 public void cargarLista(){
		 ConexBD prueba = ConexBD.getInstance();
			
			try {
				prueba.conectar();
				List<Empleado> listaEmpleados = prueba.listaEmpleados();
				DefaultListModel modelo = new DefaultListModel();
				for (Empleado p:listaEmpleados){
					modelo.addElement(p.getNombre());
				    }
				lnombres.setModel(modelo);
				prueba.desconectar();
				
			} catch (ClassNotFoundException | SQLException e) {
				// TODO Auto-generated catch block
				System.out.println("Algun error con la conexion BD");
				e.printStackTrace();
			}
	}
	
	        // listener de la lista  lo que hace es crear el panel de la derecha
			public void consultaEmpleado(){
			  String nombre= (String) lnombres.getSelectedValue();		
	          ConexBD prueba = ConexBD.getInstance();
				
				try {
					prueba.conectar();
					Empleado empleado = prueba.consultaEmpleado(nombre);				
					PanelFichaEmpleado panelEmpleado = new PanelFichaEmpleado(empleado);
					panelCentral.removeAll();
					panelCentral.add(panelEmpleado);
					panelCentral.updateUI();
					this.repaint();
							
					prueba.desconectar();
					
				} catch (ClassNotFoundException | SQLException e) {
					// TODO Auto-generated catch block
					System.out.println("Algun error con la conexion BD");
					e.printStackTrace();
				}
			}


	/**
	 * action listener de los botones de arriba
	 */
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		JButton boton =(JButton)arg0.getSource();
		
		//Boton que da de baja a un empleado y lo pasa a un fichero TXT
		if (boton == bBaja){
			if (lnombres.getSelectedIndex()!=-1)
			{
	
				String nombreEmpleado = (String) lnombres.getSelectedValue();
				ConexBD prueba = ConexBD.getInstance();
				Empleado emp = null;
			try { 
					prueba.conectar();
					emp = prueba.buscarEmpleado(nombreEmpleado);
					
					ObjectOutputStream ficheroBajas = null;
					try {
						ficheroBajas = new ObjectOutputStream(new FileOutputStream("FICHEROBAJAS.TXT"));
					} catch (FileNotFoundException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					try {
						ficheroBajas.writeObject(emp);
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					try {
						ficheroBajas.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					prueba.borrarEmpleado(emp);
					prueba.desconectar();
					
					
				} catch (ClassNotFoundException | SQLException e1) {
					// TODO Auto-generated catch block
					System.out.println("Algun error con la conexion BD");
					e1.printStackTrace();
				}
								
			}	
			else{
				JOptionPane.showMessageDialog (this,"Tienes que seleccionar un empleado de la lista");
			}
	
		}
					
		else if (boton == bNuevoEmp){
			    VentanaNuevoEmpleado a = new VentanaNuevoEmpleado(this,null);
			    this.setVisible(false);				
			   
		}
		else if (boton == bModificar){
			
				if (lnombres.getSelectedIndex()!=-1)
				{
					//modifico los datos
					String nombreEmpleado = (String) lnombres.getSelectedValue();
					ConexBD prueba = ConexBD.getInstance();
					Empleado emp = null;
					try {
						prueba.conectar();
						emp = prueba.buscarEmpleado(nombreEmpleado);
						prueba.desconectar();
						
					} catch (ClassNotFoundException | SQLException e1) {
						// TODO Auto-generated catch block
						System.out.println("Algun error con la conexion BD");
						e1.printStackTrace();
					}
					VentanaNuevoEmpleado nEmp = new VentanaNuevoEmpleado(this,emp);
					 this.setVisible(false);
					
				}	
				else{
					JOptionPane.showMessageDialog (this,"Tienes que seleccionar un empleado de la lista");
				}
		}else if(boton==bMenu){
		  this.setVisible(false);
		  vNemp.setVisible(true);
		  
	}else if (boton==btnBorrarEmpleado){
		
		 String nombre= (String) lnombres.getSelectedValue();
		 
		 if (lnombres.getSelectedIndex()!=-1)
			{
		 
         ConexBD prueba = ConexBD.getInstance();
			
			try {
				prueba.conectar();
				Empleado empleado = prueba.consultaEmpleado(nombre);				
				prueba.borrarEmpleado(empleado);
				
				prueba.desconectar();
				cargarLista();
				JOptionPane.showMessageDialog (this,"Empleado borrado de la base de datos");
				
			} catch (ClassNotFoundException | SQLException e) {
				// TODO Auto-generated catch block
				System.out.println("Algun error con la conexion BD");
				e.printStackTrace();
			}
			}else{
				JOptionPane.showMessageDialog (this,"Tienes que seleccionar un empleado de la lista");
			}
	}else if(arg0.getSource().equals(btnGestionHoras)){
		if (lnombres.getSelectedIndex()!=-1)
		{
			//modifico los datos
			String nombreEmpleado = (String) lnombres.getSelectedValue();
			ConexBD prueba = ConexBD.getInstance();
			Empleado emp = null;
			try {
				prueba.conectar();
				emp = prueba.buscarEmpleado(nombreEmpleado);
				prueba.desconectar();
				
			} catch (ClassNotFoundException | SQLException e1) {
				// TODO Auto-generated catch block
				System.out.println("Algun error con la conexion BD");
				e1.printStackTrace();
			}
		VentanaGestionHoras vgh= new VentanaGestionHoras(this, emp);
		this.setVisible(false);
		}else{
			JOptionPane.showMessageDialog (this,"Tienes que seleccionar un empleado de la lista");
		}
	}
					
		
}
		
	
@Override
public void mouseClicked(MouseEvent e) {
	this.consultaEmpleado();
	panelCentral.updateUI();
	this.repaint();
	
}

@Override
public void mouseEntered(MouseEvent e) {
	// TODO Auto-generated method stub
	
}

@Override
public void mouseExited(MouseEvent e) {
	// TODO Auto-generated method stub
	
}

@Override
public void mousePressed(MouseEvent e) {
	
}

@Override
public void mouseReleased(MouseEvent e) {
	// TODO Auto-generated method stub
	
}

@Override
public void valueChanged(ListSelectionEvent e) {

}


}
